package com.xjnt.frameworks.plugin.shiro.interceptor;

import java.util.List;

import org.apache.shiro.authz.AuthorizationException;
import org.apache.shiro.authz.UnauthenticatedException;

import com.jfinal.aop.Interceptor;
import com.jfinal.aop.Invocation;
import com.xjnt.frameworks.plugin.shiro.ShiroKit;
import com.xjnt.frameworks.plugin.shiro.handler.AuthzHandler;

public class ShiroInterceptor implements Interceptor {

	public void intercept(Invocation ai) {
		List<AuthzHandler> ahs = ShiroKit.getAuthzHandler(ai.getController().getRequest(), ai.getActionKey());
		// 存在访问控制处理器。
		if (ahs != null) {
			try {
				for (AuthzHandler ah : ahs) {
					// 执行权限检查。
					ah.assertAuthorized();
				}
			} catch (UnauthenticatedException lae) {
				// RequiresGuest，RequiresAuthentication，RequiresUser，未满足时，抛出未经授权的异常。
				// 如果没有进行身份验证，返回HTTP401状态码,或者跳转到默认登录页面
				//没有设定登录页面，则返回401错误
				ai.getController().renderError(401);
				return;
			} catch (AuthorizationException ae) {
				// RequiresRoles，RequiresPermissions授权异常
				// 如果没有权限访问对应的资源，返回HTTP状态码403，或者调转到为授权页面
				//返回403错误
				ai.getController().renderError(403);
				return;
			}
		}
		// 执行正常逻辑
		ai.invoke();
	}
}
